package com.feishi.office.docx4j;

import org.docx4j.Docx4J;
import org.docx4j.convert.out.FOSettings;
import org.docx4j.fonts.IdentityPlusMapper;
import org.docx4j.fonts.Mapper;
import org.docx4j.fonts.PhysicalFonts;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class Docx4jUtil {
    public static void main(String[] args) throws FileNotFoundException {
        FileInputStream inputStream=new FileInputStream("D:/out.xml");
        WordprocessingMLPackage mlPackage = null;
        try {

            mlPackage = WordprocessingMLPackage.load(inputStream);
            setFont(mlPackage);
//            FOSettings foSettings = Docx4J.createFOSettings();
//            foSettings.setWmlPackage(mlPackage);
//            foSettings.
//            Docx4J.toFO(foSettings, response.getOutputStream(), Docx4J.FLAG_EXPORT_PREFER_NONXSL);
            FileOutputStream out=new FileOutputStream(new File("D:/out.pdf"));
            Docx4J.toPDF(mlPackage, out);
            FOSettings settings = Docx4J.createFOSettings();
            settings.setWmlPackage(mlPackage);
            settings.setApacheFopMime("application/pdf");
            Docx4J.toFO(settings, new FileOutputStream("D:/tmp1.pdf"), Docx4J.FLAG_NONE);
            Docx4J.toFO(settings, new FileOutputStream("D:/tmp2.pdf"), Docx4J.FLAG_EXPORT_PREFER_XSL);
            Docx4J.toFO(settings, new FileOutputStream("D:/tmp3.pdf"), Docx4J.FLAG_EXPORT_PREFER_NONXSL);
        } catch (Docx4JException e) {
            e.printStackTrace();
        }
    }

    private static void setFont(WordprocessingMLPackage wordprocessingMLPackage) {
        Mapper fontMapper = new IdentityPlusMapper();
        fontMapper.put("隶书", PhysicalFonts.get("LiSu"));
        fontMapper.put("宋体", PhysicalFonts.get("SimSun"));
        fontMapper.put("微软雅黑", PhysicalFonts.get("Microsoft Yahei"));
        fontMapper.put("黑体", PhysicalFonts.get("SimHei"));
        fontMapper.put("楷体", PhysicalFonts.get("KaiTi"));
        fontMapper.put("新宋体", PhysicalFonts.get("NSimSun"));
        fontMapper.put("华文行楷", PhysicalFonts.get("STXingkai"));
        fontMapper.put("华文仿宋", PhysicalFonts.get("STFangsong"));
        fontMapper.put("仿宋", PhysicalFonts.get("FangSong"));
        fontMapper.put("幼圆", PhysicalFonts.get("YouYuan"));
        fontMapper.put("华文宋体", PhysicalFonts.get("STSong"));
        fontMapper.put("华文中宋", PhysicalFonts.get("STZhongsong"));
        fontMapper.put("等线", PhysicalFonts.get("SimSun"));
        fontMapper.put("等线 Light", PhysicalFonts.get("SimSun"));
        fontMapper.put("华文琥珀", PhysicalFonts.get("STHupo"));
        fontMapper.put("华文隶书", PhysicalFonts.get("STLiti"));
        fontMapper.put("华文新魏", PhysicalFonts.get("STXinwei"));
        fontMapper.put("华文彩云", PhysicalFonts.get("STCaiyun"));
        fontMapper.put("方正姚体", PhysicalFonts.get("FZYaoti"));
        fontMapper.put("方正舒体", PhysicalFonts.get("FZShuTi"));
        fontMapper.put("华文细黑", PhysicalFonts.get("STXihei"));
        fontMapper.put("宋体扩展", PhysicalFonts.get("simsun-extB"));
        fontMapper.put("仿宋_GB2312", PhysicalFonts.get("FangSong_GB2312"));
        fontMapper.put("新細明體", PhysicalFonts.get("SimSun"));
        try {
            wordprocessingMLPackage.setFontMapper(fontMapper);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
